#include "xdgmimemagic.h"
#include "xdgmimealias.h"
#include "xdgmimeparent.h"
+#include "xdgmimecache.h"
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
static XdgParentList *parent_list = NULL;
static XdgDirTimeList *dir_time_list = NULL;
static XdgCallbackList *callback_list = NULL;
+XdgMimeCache **caches = NULL;
+int n_caches = 0;
+
const char *xdg_mime_type_unknown = "application/octet-stream";
assert (directory != NULL);
+ file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);
+ strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");
+ if (stat (file_name, &st) == 0)
+ {
+ XdgMimeCache *cache = _xdg_mime_cache_new_from_file (file_name);
+
+ if (cache != NULL)
+ {
+ list = xdg_dir_time_list_new ();
+ list->directory_name = file_name;
+ list->mtime = st.st_mtime;
+ list->next = dir_time_list;
+ dir_time_list = list;
+
+ caches = realloc (caches, n_caches + 1);
+ caches[n_caches] = cache;
+ n_caches++;
+
+ return FALSE;
+ }
+ }
+
file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1);
strcpy (file_name, directory); strcat (file_name, "/mime/globs");
if (stat (file_name, &st) == 0)
return TRUE;
}
+ /* Check the mime.cache file */
+ file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1);
+ strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache");
+ invalid = xdg_check_file (file_name);
+ free (file_name);
+ if (invalid)
+ {
+ *invalid_dir_list = TRUE;
+ return TRUE;
+ }
+
return FALSE; /* Keep processing */
}
xdg_mime_init ();
+ if (caches)
+ return _xdg_mime_cache_get_mime_type_for_data (data, len);
+
mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len);
if (mime_type)
xdg_mime_init ();
+ if (caches)
+ return _xdg_mime_cache_get_mime_type_for_file (file_name);
+
base_name = _xdg_get_base_name (file_name);
mime_type = xdg_mime_get_mime_type_from_file_name (base_name);
xdg_mime_init ();
+ if (caches)
+ return _xdg_mime_cache_get_mime_type_from_file_name (file_name);
+
mime_type = _xdg_glob_hash_lookup_file_name (global_hash, file_name);
if (mime_type)
return mime_type;
{
xdg_mime_init ();
+ if (caches)
+ return _xdg_mime_cache_get_max_buffer_extents ();
+
return _xdg_mime_magic_get_buffer_extents (global_magic);
}
xdg_mime_init ();
+ if (caches)
+ return _xdg_mime_cache_unalias_mime_type (mime_type);
+
if ((lookup = _xdg_mime_alias_list_lookup (alias_list, mime_type)) != NULL)
return lookup;
xdg_mime_init ();
+ if (caches)
+ return _xdg_mime_cache_mime_type_subclass (mime, base);
+
umime = xdg_mime_unalias_mime_type (mime);
ubase = xdg_mime_unalias_mime_type (base);
return 0;
}
+char **
+xdg_mime_list_mime_parents (const char *mime)
+{
+ const char **parents;
+ char **result;
+ int i, n;
+
+ if (caches)
+ return _xdg_mime_cache_list_mime_parents (mime);
+
+ parents = xdg_mime_get_mime_parents (mime);
+ for (i = 0; parents[i]; i++) ;
+
+ n = (i + 1) * sizeof (char *);
+ result = (char **) malloc (n);
+ memcpy (result, parents, n);
+
+ return result;
+}
+
const char **
xdg_mime_get_mime_parents (const char *mime)
{